package com.springboot.config;

import com.springboot.bean.Furn;
import com.springboot.bean.Monster;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * @Description:
 * @Author: 张锦波
 * @Date: 2024/8/4 1:02
 * @Version: 1.0
 */

/**
 * 1.@Configuration :表示只是一个配置类，等价于配置文件
 * 2.程序员可以通过@Bean 注解注入Bean对象到容器
 * 3.当一个类被@Configuration修饰后，该类所对应的那个bean也会被注入到容器中
 */

/**
 * 1. proxyBeanMethods：代理 bean 的方法
 * (1) Full(proxyBeanMethods = true)、【保证每个@Bean 方法被调用多少次返回的组件都是
 * 单实例的, 是代理方式】
 * (2) Lite(proxyBeanMethods = false)【每个@Bean 方法被调用多少次返回的组件都是新创
 * 建的, 是非代理方式】
 * (3) 特别说明: proxyBeanMethods 是在 调用@Bean 方法 才生效，
 * 因此，需要先获取BeanConfig 组件，再调用方法
 * 而不是直接通过 SpringBoot 主程序得到的容器来获取 bean, 注意观察直接通过
 * ioc.getBean() 获取 Bean, proxyBeanMethods 值并没有生效
 * (4) 如何选择: 组件依赖必须使用 Full 模式默认。如果不需要组件依赖使用 Lite 模
 * (5) Lite 模 也称为轻量级模式，因为不检测依赖关系，运行速度快
 */

/**
 * @EnableConfigurationProperties(Furn.class)
 * 1.开启Furn配置绑定功能
 * 2.把Furn组件自动注入到容器中
 */
@EnableConfigurationProperties(Furn.class)
@Configuration(proxyBeanMethods = false)
public class BeanConfig {

    /**
     * 1. @Bean :给容器注入组件，就是Monster Bean
     * 2. monster01() :默认你的方法名monster01作为Bean的id
     * 3. Monster : 表示注入类型，注入bean的类型是 Monster
     * 4. new Monster(300, "孙猴子", "金箍棒", 600): 注入到容器中具体Bean信息
     * 5. @Bean(name = "monster_nmw") : 在配置、注入Bean 指定id为monster_nmw
     * 6. 默认情况下是单例的
     * 7. @Scope("prototype") 表示修改为多例
     */
//    @Bean(name = "monster_nmw")
    @Bean
    @Scope("prototype")
    public Monster monster01() {
        return new Monster(300, "孙猴子", "金箍棒", 600);
    }
}
